/**
 * 串口管理器类
 * 负责与ESP32设备的串口通信
 */

export class SerialManager {
    constructor(state) {
        this.state = state;
    }

    /**
     * 连接到设备
     */
    async connect() {
        if (!('serial' in navigator)) {
            throw new Error('您的浏览器不支持Web Serial API，请使用最新版Chrome浏览器');
        }

        try {
            // 请求用户选择串口
            const port = await navigator.serial.requestPort();
            
            // 打开串口
            await port.open({ baudRate: 115200 });
            
            // 保存串口引用
            this.state.setSerialPort(port);
            
            return port;
        } catch (error) {
            throw new Error('连接设备失败: ' + error.message);
        }
    }

    /**
     * 断开设备连接
     */
    async disconnect() {
        const port = this.state.getSerialPort();
        if (port) {
            try {
                await port.close();
                this.state.setSerialPort(null);
                return true;
            } catch (error) {
                throw new Error('断开连接时出错: ' + error.message);
            }
        }
        return true;
    }

    /**
     * 烧录固件
     * @param {File} file 固件文件
     */
    async flashFirmware(file) {
        const port = this.state.getSerialPort();
        if (!port) {
            throw new Error('请先连接设备');
        }

        if (!file) {
            throw new Error('请选择固件文件');
        }

        // 模拟烧录过程
        return new Promise((resolve, reject) => {
            this.simulateFlashing((progress) => {
                // 更新进度条（通过全局UI引用）
                if (window.esp32DevTool && window.esp32DevTool.ui) {
                    const flashProgress = document.getElementById('flash-progress');
                    const progressPercent = document.getElementById('progress-percent');
                    
                    if (flashProgress && progressPercent) {
                        flashProgress.style.width = progress + '%';
                        progressPercent.textContent = Math.round(progress) + '%';
                    }
                }
            }, (success) => {
                if (success) {
                    resolve();
                } else {
                    reject(new Error('烧录失败'));
                }
            });
        });
    }

    /**
     * 模拟烧录过程
     * @param {Function} onProgress 进度回调
     * @param {Function} onComplete 完成回调
     */
    simulateFlashing(onProgress, onComplete) {
        let progress = 0;
        
        // 重置进度条
        if (window.esp32DevTool && window.esp32DevTool.ui) {
            const flashProgress = document.getElementById('flash-progress');
            const progressPercent = document.getElementById('progress-percent');
            
            if (flashProgress && progressPercent) {
                flashProgress.style.width = '0%';
                progressPercent.textContent = '0%';
            }
        }

        const interval = setInterval(() => {
            progress += Math.random() * 10;
            if (progress >= 100) {
                progress = 100;
                clearInterval(interval);
                onComplete(true);
            }
            onProgress(progress);
        }, 200);
    }

    /**
     * 发送串口命令
     * @param {string} command 命令
     */
    async sendCommand(command) {
        const port = this.state.getSerialPort();
        if (!port) {
            throw new Error('设备未连接');
        }

        // 这里应该实现实际的串口通信逻辑
        // 为简化起见，我们只是模拟
        console.log('发送命令:', command);
        return 'OK';
    }
}